package com.github.scr.j8iterables;
import com.github.scr.j8iterables.core.CompletableListenableFuture;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import javax.annotation.Nonnull;
import java.util.concurrent.CompletableFuture;
/**
* For converting between Java8' {@link CompletableFuture} and guava's {@link ListenableFuture}.
*
* @author scr on 1/27/17.
*/
@SuppressWarnings("WeakerAccess")
public class J8Futures {
/**
* Convert a {@link ListenableFuture} to a {@link CompletableFuture}.
*
* @param listenableFuture The Guava listenable future to convert
* @param <T> The value type of the future
* @return a Java8 completable future
*/
@Nonnull
public static <T> CompletableFuture<T> asCompletableFuture(ListenableFuture<T> listenableFuture) {
return new CompletableListenableFuture<T>(listenableFuture);
}
/**
* Convert a {@link CompletableFuture} to a {@link ListenableFuture}.
*
* @param completableFuture The Java8 completable future to convert
* @param <T> The value type of the future
* @return a Guava listenable future
*/
@Nonnull
public static <T> ListenableFuture<T> asListenableFuture(CompletableFuture<T> completableFuture) {
if (completableFuture instanceof CompletableListenableFuture) {
return ((CompletableListenableFuture<T>) completableFuture).delegateListenableFuture;
}
SettableFuture<T> ret = SettableFuture.create();
completableFuture.whenComplete((result, ex) -> {
if (completableFuture.isCancelled()) {
ret.cancel(true);
} else if (ex != null) {
ret.setException(ex);
} else {
ret.set(result);
}
});
return ret;
}
}